﻿namespace est5
{
    internal class class5
    {
        static void Main(string[] args)
        {
            Console.WriteLine("值类型和引用类型");
            #region     知识点一   变量类型复习
            //有无符号整型
            //浮点数
            //特殊类型
            //复杂数据类型
            //枚举
            //数组

            //把以上 学过的 变量类型 分成 值类型和引用类型
            //引用类型:string，数组，类
            //值类型：其它，结构体
            #endregion
            #region     知识点二   值类型和引用类型的区别
            //1.两者区别
            //值类型
            int a = 5;
            int b = a;
            Console.WriteLine("a={0},b={1}",a,b);
            //引用类型
            int[] arr1 = {1,2,3,4,5};
            int[] arr2 = arr1;
            Console.WriteLine("arr1={0},arr2={1}", arr1[0], arr2[0]);

            Console.WriteLine("修改之后");
            a = 10;
            arr1[0] = 63;
            Console.WriteLine("a={0},b={1}", a, b);//a和b不同
            Console.WriteLine("arr1={0},arr2={1}", arr1[0], arr2[0]);//相同 

            //值类型引用 在相互赋值时 把内容拷贝给了对方  他变我不变
            //引用类型相互赋值时 是 让两者指向同一个值  它变我也变

            //2。为什么会有以上区别
            //值类型 和 引用类型 存储在的 内存区域 是不同的

            //值类型 存储在 栈空间 ——系统分配，自动回收 小而快
            //引用类型 存储在 堆空间——手动申请和释放 大而慢
            //这里听完课用自己的理解解释一下：
            //值与值之间相等只是复制粘贴，其中一方变化另一方不会一起变，是短期的
            //引用类型之间相等的不是值是地址，每个元素存储在地址里，元素变化 地址不会变化，是长期的
            //举个比较具象的例子：
            //值与值之间就像两个不同的房子，相等之后两个房子布置和家具都一样，但只要其中一个房子里换了东西，两位就不一样了
            //引用是谁等于谁就搬到谁的房间里，不管房间布局怎么变，两位的房子都一样（除非搬家）


            //注意！！！！！！！！！！！
            string str = "123";
            string str2 = str;
            str2 = "321";
            Console.WriteLine(str);
            //string是引用类型，但他是不可变的
            //str2="321"是重新让str2指向新字符串，str不会变

            #endregion
        }
    }
}
